package com.sinoglobal.ningxia.activity.player;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.SurfaceView;

import com.sinoglobal.ningxia.R;
import com.sinoglobal.ningxia.activity.base.BaseActivity;
import com.sinoglobal.ningxia.beans.LiveHomeBean;
import com.sinoglobal.ningxia.utils.ToastBuilder;

import cn.nodemedia.NodePlayer;
import cn.nodemedia.NodePlayerDelegate;

/**
 * Created by XINDZ on 2017/2/15.
 * 功能:观看直播的Activity
 */

public class LivePlayerActivity extends BaseActivity implements NodePlayerDelegate {
    /**
     * 直播地址固定为：rtmp://l1.stream.nxtv.com.cn/live/红枸杞账号（手机号）
     *
     * @author XINDZ
     * @updatedate 2017年1月18日11:12:47
     */
    public static String PLAY_URL = "rtmp://l1.stream.nxtv.com.cn/live/15801416999";
    /**
     * 直播启动缓冲区时长,单位毫秒.此参数关系视频流连接成功开始获取数据后缓冲区存在多少毫秒后开始播放 (毫秒)
     *
     * @author XINDZ
     * @updatedate 2017年1月18日11:12:47
     */
    public static int BUFFER_TIME = 500;
    /**
     * 最大缓冲区时长,单位毫秒.此参数关系视频最大缓冲时长.
     * RTMP基于TCP协议不丢包,网络抖动且缓冲区播完,之后仍然会接受到抖动期的过期数据包.
     * 设置改参数,sdk内部会自动清理超出部分的数据包以保证不会存在累计延迟,始终与直播时间线保持最大maxBufferTime的延迟
     *
     * @author XINDZ
     * @updatedate 2017年1月18日11:12:47
     */
    public static int MAX_BUFFER_TIME = 1000;
    NodePlayer np;
    private LiveHomeBean.ListBean dataBean;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_live_player);
        dataBean = (LiveHomeBean.ListBean) getIntent().getSerializableExtra(LiveHomeBean.class.getCanonicalName());
        if (dataBean != null && dataBean.getUrl() != null) {
            PLAY_URL = dataBean.getUrl();
        } else {
            ToastBuilder.getIntance(LivePlayerActivity.this).showToast("直播没有开启");
        }
        SurfaceView sv = (SurfaceView) findViewById(R.id.surfaceView_play);
        np = new NodePlayer(this);

        //设置事件回调代理
        np.setDelegate(this);

        /**
         * 设置视频显示SurfaceView视图
         *
         * sv : SurfaceView对象,如果传null,则只解码播放纯音频
         * NodePlayer.UIViewContentModeScaleAspectFit : 视频等比缩放填充模式显示
         *   画面填充模式,当前支持下面三种现实模式，他们的差别是
         *   当SurfaceView高宽比与视频高宽比不同时           视频画面是否铺满SurfaceView |画面是否变形|有无黑边|视频画面是否会被裁剪
         *   拉伸填充 UIViewContentModeScaleToFill           是                     |   是      |  无   | 否
         *   等比缩放 UIViewContentModeScaleAspectFit        否                     |   否      |  有   | 否
         *   等比缩放填充 UIViewContentModeScaleAspectFill    是                     |   否      |  无   | 是
         */
        np.setSurfaceView(sv, NodePlayer.UIViewContentModeScaleAspectFit);


        /**
         * 设置启动缓冲区时长,单位毫秒.此参数关系视频流连接成功开始获取数据后缓冲区存在多少毫秒后开始播放
         */
        np.setBufferTime(BUFFER_TIME);

        /**
         * 设置最大缓冲区时长,单位毫秒.此参数关系视频最大缓冲时长.
         * RTMP基于TCP协议不丢包,网络抖动且缓冲区播完,之后仍然会接受到抖动期的过期数据包.
         * 设置改参数,sdk内部会自动清理超出部分的数据包以保证不会存在累计延迟,始终与直播时间线保持最大maxBufferTime的延迟
         */
        np.setMaxBufferTime(MAX_BUFFER_TIME);

        /**
         * 设置连接超时时长,单位毫秒.默认一直等待.
         * 连接部分RTMP服务器,握手并连接成功后,当播放一个不存在的流地址时,会一直等待下去.
         * 如需超时,设置该值.超时后返回1006状态码.
         */
        np.setTimeout(10 * 1000);

        /**
         * 开始播放直播视频url
         */
        np.startPlay(PLAY_URL);

        /**
         * 开始播放直播视频url,并且服务端会验证pageUrl,swfUrl的形式
         */
//        np.startPlay(playUrl,"your page url","your swf url");

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        /**
         * 停止播放
         */
        np.stopPlay();

        /**
         * 释放资源
         */
        np.deInit();
    }

    @Override
    public void onEventCallback(NodePlayer nodePlayer, int i, String s) {
        Message message = new Message();
        message.what = i;
        message.obj = nodePlayer;
        handler.sendMessage(message);
        Log.i("NodeMediaClient", "直播播放页面:onEventCallback:" + i + " msg:" + s);

    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            NodePlayer nodePlayer = (NodePlayer) msg.obj;
            switch (msg.what) {
                case 1000:
                    // 正在连接视频
                    break;
                case 1001:
                    // 视频连接成功
                    break;
                case 1002:
                    // 视频连接失败 流地址不存在，或者本地网络无法和服务端通信，回调这里。5秒后重连， 可停止
                    nodePlayer.stopPlay();
                    break;
                case 1003:
                    // 视频开始重连,自动重连总开关
//                nodePlayer.stopPlay();
                    break;
                case 1004:
                    // 视频播放结束
                    ToastBuilder.getIntance(LivePlayerActivity.this).showToast("直播结束");
                    break;
                case 1005:
                    // 网络异常,播放中断,播放中途网络异常，回调这里。1秒后重连，如不需要，可停止
//                nodePlayer.stopPlay();
                    break;
                case 1006:
                    //RTMP连接播放超时
                    break;
                case 1100:
                    // 播放缓冲区为空
//				System.out.println("NetStream.Buffer.Empty");
                    break;
                case 1101:
                    // 播放缓冲区正在缓冲数据,但还没达到设定的bufferTime时长
//				System.out.println("NetStream.Buffer.Buffering");
                    break;
                case 1102:
                    // 播放缓冲区达到bufferTime时长,开始播放.
                    // 如果视频关键帧间隔比bufferTime长,并且服务端没有在缓冲区间内返回视频关键帧,会先开始播放音频.直到视频关键帧到来开始显示画面.
//				System.out.println("NetStream.Buffer.Full");
                    break;
                case 1103:
//				System.out.println("Stream EOF");
                    // 客户端明确收到服务端发送来的 StreamEOF 和 NetStream.Play.UnpublishNotify时回调这里
                    // 注意:不是所有云cdn会发送该指令,使用前请先测试
                    // 收到本事件，说明：此流的发布者明确停止了发布，或者因其网络异常，被服务端明确关闭了流
                    // 本sdk仍然会继续在1秒后重连，如不需要，可停止
                    nodePlayer.stopPlay();
                    break;
                case 1104:
                    //解码后得到的视频高宽值 格式为:{width}x{height}
                    break;
                default:
                    break;
            }
        }
    };
}
